home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 051-060 / amok55 / m2midi / midid.def < prev    next >
Text File  |  1993-11-04  |  14KB  |  483 lines

  1. (***************************************************************************
  2.   :Program.       MidiD.def
  3.   :Author.        Jürgen Zimmermann
  4.   :Address.       Ringstraße 6, 6719 Altleiningen, West-Germany
  5.   :Phone.         06356/1456
  6.   :ShortCut.      [JnZ]
  7.   :Support.       -
  8.   :Version.       1.02
  9.   :Date.          08. May 1991
  10.   :Copyright.     PD
  11.   :Language.      MODULA-II
  12.   :Translator.    M2Amiga 4.0d
  13.   :Contents.      Eine Modula-2 Implementation für Bill Barton's
  14.   :Contents.      "midi.library" von Fish 227, siehe auch "MidiSupport"!
  15.   :Imports.       "midi.library" V2.0 im LIBS:-Ordner
  16.   :Remark.        Ich würde mich sehr über Kontakt mit anderen M2Amiga-Usern
  17.   :Remark.        und MIDI-Freaks freuen.
  18.   :Usage.         Siehe Anleitung für die Midi-Library (anbei!)
  19. ****************************************************************************)
  20. DEFINITION MODULE MidiD;
  21. (*$ Implementation:=FALSE *)
  22.  
  23. (*  Definitions pertaining to MIDI are derived from MIDI 1.0 Detailed
  24.     Specification v4.0 (published by the Internation MIDI Association)
  25.     and is current as of June, 1988.
  26.  
  27.     v2.0 - 23-Oct-88 *)
  28.  
  29. FROM SYSTEM     IMPORT ADDRESS, BPTR;
  30. FROM ExecD      IMPORT List, Library, SignalSemaphore, MsgPortPtr,
  31.                        MinList, Node, MinNode, Message, TaskPtr;
  32. FROM IntuitionD IMPORT ImagePtr;
  33.  
  34.  
  35. CONST midiName = "midi.library";
  36.  
  37.  
  38. TYPE MidiBasePtr    = POINTER TO MidiBase;
  39.      MTaskInfoPtr   = POINTER TO MTaskInfo;
  40.      MNodeInfoPtr   = POINTER TO MNodeInfo;
  41.      MSourcePtr     = POINTER TO MSource;
  42.      MDestPtr       = POINTER TO MDest;
  43.      RIMatchPtr     = POINTER TO RIMatch;
  44.      MRouteInfoPtr  = POINTER TO MRouteInfo;
  45.      MRoutePtr      = POINTER TO MRoute;
  46.      MidiPacketPtr  = POINTER TO MidiPacket;
  47.      MListSignalPtr = POINTER TO MListSignal;
  48.  
  49. (* Msg Flags for MRouteInfo structure and returned by MidiMsgType *)
  50.  
  51.      MMFFlags       = (NoteOn, NoteOff, PolyPress, Ctrl, Prog, ChanPress,
  52.                        PitchBend, Mode, SysCom, SysRt, SysEx, mmf11, mmf12,
  53.                        mmf13, mmf14, mmf15);
  54.      MMFFlagSet     = SET OF MMFFlags;
  55.  
  56. (* MidiChannel-Flags, um nur bestimmte Midi-Kanäle anzusprechen *)
  57.      MidiChannels   = (Ch01, Ch02, Ch03, Ch04, Ch05, Ch06, Ch07, Ch08,
  58.                        Ch09, Ch10, Ch11, Ch12, Ch13, Ch14, Ch15, Ch16);
  59.      MidiChannelSet = SET OF MidiChannels;
  60.  
  61.      RIMFlags       = (extBit1,extBit2,rim2,rim3,rim4,rim5,extId,reverse);
  62.      RIMFlagSet     = SET OF RIMFlags;
  63.  
  64.  
  65. CONST MMFChan      = MMFFlagSet{NoteOn..Mode};
  66.       MMFAll       = MMFChan + MMFFlagSet{SysCom, SysRt, SysEx};
  67.  
  68.       AllChannels  = MidiChannelSet{Ch01..Ch16};
  69.  
  70.       RIMCountBits = RIMFlagSet{extBit1, extBit2};
  71.         (* mask for # of match values (0 for match all) *)
  72.       RIMExtId     = RIMFlagSet{extId};
  73.         (* indicates all 3 bytes of match[] == one 3 byte manuf.
  74.            id (not valid for CtrlMatch) *)
  75.       RIMExclude   = RIMFlagSet{reverse};
  76.         (* reverses logic of RIMatch so that all except those specified pass *)
  77.  
  78.  
  79.       RIMMaxCount = 3;
  80.  
  81.    (* node types for Source *)
  82.       NTMSource     = 20H;
  83.       NTMResMSource = 21H;
  84.  
  85.    (* node types for Dest *)
  86.       NTMDest       = 22H;
  87.       NTResMDest    = 23H;
  88.  
  89.    (* user flags *)
  90.       MLSFSource = 00000001H; (* causes signal when SourceList changes *)
  91.       MLSFDest   = 00000002H; (* causes signal when DestList changes *)
  92.  
  93.  
  94. TYPE MidiBase = RECORD
  95.                    libnode       : Library;
  96.                    SourceList    : List;
  97.                    DestList      : List;
  98.                    ListSemaphore : SignalSemaphore;
  99.                       (* blocks Source/Dest list management *)
  100.                    RouteSemaphore: SignalSemaphore;
  101.                       (* blocks RPList management & msg routing *)
  102.                    SegList       : LONGCARD;
  103.                    SysBase       : ADDRESS;
  104.                    DosBase       : ADDRESS;
  105.                    SignalList    : MinList;
  106.                       (* list of MListSignal's *)
  107.                 END;
  108.  
  109.      MTaskInfo = RECORD
  110.                  (* set by caller *)
  111.                     name      : ADDRESS;
  112.                     Pri       : INTEGER;
  113.                     Entry     : ADDRESS; (* Adresse des TaskCodes *)
  114.                     Stack     : CARDINAL;
  115.  
  116.                     Sources   : CARDINAL;
  117.                     SourceList: MNodeInfoPtr;
  118.                     Dests     : CARDINAL;
  119.                     DestList  :  MNodeInfoPtr;
  120.  
  121.                  (* set by midi.library *)
  122.                     Semaphore : SignalSemaphore;    (* locks task *)
  123.                     UsageCount: CARDINAL;        (* task's usage count *)
  124.                     TaskPort  : MsgPortPtr;        (* task's MsgPort *)
  125.                     Segment   : BPTR;            (* task's Segment *)
  126.                  END;
  127.  
  128.  
  129.      MNodeInfo = RECORD
  130.                     name : ADDRESS;
  131.                     image: ImagePtr;
  132.                     node : ADDRESS;
  133.                  END;
  134.  
  135.  
  136.      MSource = RECORD
  137.                   node          : Node;
  138.                   image         : ImagePtr;
  139.                   RPList        : MinList;
  140.                   userData      : ADDRESS;    (* user data extension *)
  141.  
  142.                (* new stuff for v2.0 *)
  143.                   RouteMsgFlags : MMFFlagSet;
  144.                   RouteChanFlags: MidiChannelSet;
  145.  
  146. (*  RouteMsgFlags: mask of all route->MsgFlags for this MSource;
  147.     RouteChanFlags: mask of all route->ChanFlags for this MSource *)
  148.  
  149.                END;
  150.  
  151.  
  152. TYPE RIMatch = RECORD
  153.                   flags: RIMFlagSet;
  154.                   match: ARRAY[1..RIMMaxCount] OF SHORTCARD;
  155.                END;
  156.  
  157.  
  158.  
  159.      MRouteInfo = RECORD
  160.                      MsgFlags  : MMFFlagSet;
  161.                      ChanFlags : MidiChannelSet;
  162.                      ChanOffset: SHORTINT;
  163.                      NoteOffset: SHORTINT;
  164.                      SysExMatch: RIMatch;
  165.                      CtrlMatch : RIMatch;
  166.  
  167. (* MsgFlags:  flags enabling message types defined below (MMF_) (msg filters);
  168.    ChanFlags: incoming channel enable flags (LSB = chan 1, MSB = chan 16)
  169.               (channel filters);
  170.    ChanOffset: signed offset applied to channels (simple channelizing);
  171.    NoteOffset: signed offset applied to note numbers (transposition);
  172.    SysExMatch: Sys/Ex manufacturer id filtering;
  173.    CtrlMatch: Controller number filtering *)
  174.                   END;
  175.  
  176.  
  177.      MDest = RECORD
  178.                 node            : Node;
  179.                 image           : ImagePtr;
  180.                 RPList          : MinList;
  181.                 DestPort        : MsgPortPtr;
  182.                 userData        : ADDRESS;(* user data extension *)
  183.  
  184.              (* new stuff for v2.0 *)
  185.                 DefaultRouteInfo: MRouteInfo;
  186.                    (* used when Routing function doesn't supply a RouteInfo *)
  187.              END;
  188.  
  189.  
  190.  
  191. TYPE MRoutePointer = RECORD (* alias MRoutePtr (C-Definition!) *)
  192.                         node : MinNode;
  193.                         Route: MRoutePtr;
  194.                      END;
  195.  
  196.  
  197.      MRoute = RECORD
  198.                  Source   : MSourcePtr;
  199.                  Dest     : MDestPtr;
  200.                  SRoute   : MRoutePointer;
  201.                  DRoute   : MRoutePointer; (* MRoutePtr (C-Definition!) *)
  202.                  RouteInfo: MRouteInfo;
  203.               END;
  204.  
  205.  
  206.  
  207.  
  208. (* MIDI Packet (new for v2.0) *)
  209.  
  210.        MidiPacket = RECORD        (* returned by GetMidiPacket() *)
  211.                        ExecMsg : Message;
  212.                        Type    : MMFFlagSet;
  213.                        Length  : CARDINAL;
  214.                        reserved: LONGCARD;
  215.                        MidiMsg : ARRAY[1..4] OF SHORTCARD;
  216.  
  217. (* ExecMsg: ***;
  218.    Type: MMF_ bit for this message (as returned by MidiMsgType());
  219.    Length: length of msg in bytes (as returned by MidiMsgLength());
  220.    reserved: reserved for future expansion;
  221.    MidiMsg: actual MIDI message (real length of this array is Length,
  222.             always at least this much memory allocated) *)
  223.  
  224.                     END;
  225.  
  226.  
  227. (* Public List Change Signal *)
  228.  
  229.         MListSignal = RECORD
  230.                          node   : MinNode;
  231.                          SigTask: TaskPtr;    (* task to signal *)
  232.                          SigBit : SHORTCARD;    (* signal bit to use *)
  233.                          Flags  : SHORTCARD;    (* user flags *)
  234.                       END;
  235.  
  236.  
  237.  
  238. (* MIDI message defininition *)
  239.  
  240. (* Status Bytes *)
  241.  
  242.     (* Channel Voice Messages (1sssnnnn) (OR with channel number) *)
  243. CONST
  244.  
  245.  MSNOTEOFF   = 80H;
  246.  MSNOTEON    = 90H;
  247.  MSPOLYPRESS = 0A0H;
  248.  MSCTRL      = 0B0H;
  249.  MSMODE      = 0B0H;
  250.  MSPROG      = 0C0H;
  251.  MSCHANPRESS = 0D0H;
  252.  MSPITCHBEND = 0E0H;
  253.  
  254.     (* System Common Messages (11110sss) *)
  255.  MSSYSEX      = 0F0H;
  256.  MSQTRFRAME   = 0F1H;
  257.  MSSONGPOS    = 0F2H;
  258.  MSSONGSELECT = 0F3H;
  259.  MSTUNEREQ    = 0F6H;
  260.  MSEOX          = 0F7H;
  261.  
  262.     (* System Real Time Messages (11111sss) *)
  263.  MSCLOCK     = 0F8H;
  264.  MSSTART     = 0FAH;
  265.  MSCONTINUE  = 0FBH;
  266.  MSSTOP      = 0FCH;
  267.  MSACTVSENSE = 0FEH;
  268.  MSRESET     = 0FFH;
  269.  
  270. (* Miscellaneous *)
  271.  
  272.  MIDDLEC      = 60H;     (* middle C note value *)
  273.  DEFAULTVELOCITY = 64H;     (* default Note On or Off velocity *)
  274.  PITCHBENDCENTER = 2000H;(* pitch bend center position as a 14 bit word *)
  275.  MCLKSPERQTR     = 24H;     (* MIDI clocks per qtr-note *)
  276.  MCLKSPERSP     = 6H;     (* MIDI clocks per song position index *)
  277.  MCCENTER     = 64H;  (* center value for controllers like Pan and Balance *)
  278.  
  279.  
  280. (* Standard Controllers *)
  281.  
  282.     (* continuous 14 bit - MSB: 0-1f, LSB: 20-3f *)
  283.  MCMODWHEEL   = 01H;
  284.  MCBREATH     = 02H;
  285.  MCFOOT       = 04H;
  286.  MCPORTATIME  = 05H;
  287.  MCDATAENTRY  = 06H;
  288.  MCVOLUME     = 07H;
  289.  MCBALANCE    = 08H;
  290.  MCPAN        = 0AH;
  291.  MCEXPRESSION = 0BH;
  292.  MCGENERAL1   = 10H;
  293.  MCGENERAL2   = 11H;
  294.  MCGENERAL3   = 12H;
  295.  MCGENERAL4   = 13H;
  296.  
  297.    (* continuous 7 bit (switches: 0-3f=off, 40-7f=on) *)
  298.  MCSUSTAIN      = 40H;
  299.  MCPORTA        = 41H;
  300.  MCSUSTENUTO    = 42H;
  301.  MCSOFTPEDAL    = 43H;
  302.  MCHOLD2        = 45H;
  303.  MCGENERAL5     = 50H;
  304.  MCGENERAL6     = 51H;
  305.  MCGENERAL7     = 52H;
  306.  MCGENERAL8     = 53H;
  307.  MCEXTDEPTH     = 5BH;
  308.  MCTREMOLODEPTH = 5CH;
  309.  MCCHORUSDEPTH  = 5DH;
  310.  MCCELESTEDEPTH = 5EH;
  311.  MCPHASERDEPTH  = 5FH;
  312.  MCDATAINCR     = 60H;
  313.  MCDATADECR     = 61H;
  314.  MCNRPNL        = 62H;
  315.  MCNRPNH        = 63H;
  316.  MCRPNL         = 64H;
  317.  MCRPNH         = 65H;
  318.  
  319.  MCMAX            = 78H;    (* max controller value *)
  320.  
  321.  
  322. (* Channel Modes *)
  323.  
  324.  MMMIN          = 79H;    (* min mode value *)
  325.  
  326.  MMRESETCTRL  = 79H;
  327.  MMLOCAL      = 7AH;
  328.  MMALLOFF     = 7BH;
  329.  MMOMNIOFF    = 7CH;
  330.  MMOMNION     = 7DH;
  331.  MMMONO       = 7EH;
  332.  MMPOLY       = 7FH;
  333.  
  334.  
  335. (* Registered Parameter Numbers *)
  336. (*
  337.     These are 16 bit values that need to be separated into two bytes for
  338.     use with the MC_RPNH & MC_RPNL messages using 8 bit math (hi = MRP_
  339.     >> 8, lo = MRP_ &   ff) as opposed to 7 bit math.  This is done
  340.     so that the defines match the numbers from the MMA.  See MIDI 1.0
  341.     Detailed Spec v4.0 pp 12, 23 for more info.
  342. *)
  343.  
  344.  MRPPBSENS     = 0000H;
  345.  MRPFINETUNE   = 0001H;
  346.  MRPCOURSETUNE = 0002H;
  347.  
  348.  
  349. (* MTC Quarter Frame messages *)
  350. (*
  351.     Qtr Frame message is F1 0nnndddd where
  352.  
  353.     nnn is a message type defined below
  354.     dddd is 4 bit data nibble for those message types
  355.  
  356.     Each pair of nibbles is combined by the receiver into a single byte.
  357.     There are masks and type values defined for some of these data bytes
  358.     below.
  359. *)
  360.  
  361.     (* message types *)
  362.  MTCQFRAMEL = 00H;
  363.  MTCQFRAMEH = 10H;
  364.  MTCQSECL   = 20H;
  365.  MTCQSECH   = 30H;
  366.  MTCQMINL   = 40H;
  367.  MTCQMINH   = 50H;
  368.  MTCQHOURL  = 60H;
  369.  MTCQHOURH  = 70H;    (* also contains time code type *)
  370.  
  371.     (* message masks *)
  372.  MTCQTYPEMASK = 70H;    (* mask for type bits in message *)
  373.  MTCQDATAMASK = 0FH;    (* mask for data bits in message *)
  374.  
  375.     (* hour byte *)
  376.  MTCHTYPEMASK = 60H;    (* mask for time code type *)
  377.  MTCHHOURMASK = 1FH;    (* hours mask (range 0-23) *)
  378.  
  379.     (* time code type values for hour byte *)
  380.  MTCT24FPS        = 00H;
  381.  MTCT25FPS        = 20H;
  382.  MTCT30FPSDROP    = 40H;
  383.  MTCT30FPSNONDROP = 60H;
  384.  
  385.  
  386.  
  387.  
  388. (* Sys/Ex ID numbers *)
  389.  
  390. (* Now includes 3 byte extension for the American Group.  This new
  391.    format uses a $00 as the sys/ex id followed by two additional bytes
  392.    that actually identify the manufacturer.  These new extended id
  393.    constants are 32 bit values (24 significant bits) that you will have
  394.    to break apart manually.
  395.  
  396.    You can match or filter off one of the extended id's when using the
  397.    RIMF_EXTID bit described above. *)
  398.  
  399.     (* American Group *)
  400. XAMERICA      = 00H;
  401. SEQUENTIAL    = 01H;
  402. IDP           = 02H;
  403. OCTAVEPLATEAU = 03H;
  404. MOOG          = 04H;
  405. PASSPORT      = 05H;
  406. LEXICON       = 06H;
  407. KURZWEIL      = 07H;
  408. FENDER        = 08H;
  409. AKG           = 0AH;
  410. VOYCE         = 0BH;
  411. WAVEFRAME     = 0CH;
  412. ADA           = 0DH;
  413. GARFIELD      = 0EH;
  414. ENSONIQ       = 0FH;
  415. OBERHEIM      = 10H;
  416. APPLE         = 11H;
  417. GREYMATTER    = 12H;
  418. PALMTREE      = 14H;
  419. JLCOOPER      = 15H;
  420. LOWREY        = 16H;
  421. ADAMSSMITH    = 17H;
  422. EMU           = 18H;
  423. HARMONY       = 19H;
  424. ART           = 1AH;
  425. BALDWIN       = 1BH;
  426. EVENTIDE      = 1CH;
  427. INVENTRONICS  = 1DH;
  428. CLARITY       = 1FH;
  429.  
  430.    (* American Group extened *)
  431. DIGITALMUSIC  = 0000007H;
  432. IOTA          = 0000008H;
  433. IVL           = 000000BH;
  434. SOUTHERNMUSIC = 000000CH;
  435. LAKEBUTLER    = 000000DH;
  436. DOD           = 0000010H;
  437. PERFECTFRET   = 0000014H;
  438. OPCODE        = 0000016H;
  439. SPATIALSOUND  = 0000018H;
  440. KMX           = 0000019H;
  441. AXXES         = 0000020H;
  442.  
  443.  
  444.     (* European Group *)
  445. PASSAC         = 20H;
  446. SIEL           = 21H;
  447. SYNTHAXE       = 22H;
  448. HOHNER         = 24H;
  449. TWISTER        = 25H;
  450. SOLTON         = 26H;
  451. JELLINGHAUS    = 27H;
  452. SOUTHWORTH     = 28H;
  453. PPG            = 29H;
  454. JEN            = 2AH;
  455. SSL            = 2BH;
  456. AUDIOVERITRIEB = 2CH;
  457. ELKA           = 2FH;
  458. DYNACORD       = 30H;
  459.  
  460.     (* Japanese Group *)
  461. KAWAI         = 40H;
  462. ROLAND        = 41H;
  463. KORG          = 42H;
  464. YAMAHA        = 43H;
  465. CASIO         = 44H;
  466. MORIDAIRA     = 45H;
  467. KAMIYA        = 46H;
  468. AKAI          = 47H;
  469. JAPANVICTOR   = 48H;
  470. MEISOSHA      = 49H;
  471. HOSHINOGAKKI  = 4AH;
  472. FUJITSU       = 4BH;
  473. SONY          = 4CH;
  474. NISSHINONPA   = 4DH;
  475. SYSTEMPRODUCT = 4FH;
  476.  
  477.     (* Universal ID Numbers *)
  478. NC  = 7DH;
  479. NRT = 7EH;
  480. RT  = 7FH;
  481.  
  482. END MidiD.
  483.